package main

import "fmt"

//func longest(s string) int {
//	//哈希集合，记录每个字符是否出现过
//	m :=map[byte]int{}
//	n :=len(s)
//	rk,ans :=-1,0
//	for i:=0;i<n;i++{
//		if i !=0{
//			//左指针向右移动一格，移除一个字符
//			delete(m,s[i-1])
//		}
//		for rk +1 <n && m[s[rk+1]] == 0{
//			//不断地移动指针
//			m[s[rk+1]]++
//			rk++
//		}
//		//第i到rk个字符是一个极长的无重复字符子串
//		ans =max(ans,rk-i+1)
//	}
//	return ans
//}

func subsets(nums []int) [][]int {
    //典型的回溯算法，我把回溯努力写成大同小异，当你看到题解会一个其他的都能看懂
	var res [][]int
	var path []int
	var backTree func(start int)

	backTree=func(start int){
	    //这个是全输入，没有判空条件，所以这里没有if推出回溯的条件
		temp :=make([]int,len(path))
		copy(temp,path)
		res=append(res,temp)
        //start就是老朋友了，start是动态变化的
		for i:=start; i<len(nums);i++{
			path =append(path,nums[i])
			backTree(i+1)
			//最后一步就是回溯，倒退一个节点，每次看到回溯，脑海里应该有那个树
			path = path[:len(path)-1]
		}
	}

	backTree(0)
	return res
}

func main(){
	nums:=[]int{1,2,3}
	fmt.Println(subsets(nums))
}